package mysql

import (
	"TaskAssignmentSystem/pkg/utils"
	"fmt"
	"github.com/golang/glog"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"strings"
	"time"
)

/**
 * @Author: Vincent
 * @Description:
 * @File:  mysql
 * @Version: 1.0.0
 * @Date: 2022/3/14 14:45
 */

var _mdb *gorm.DB

// 包初始化函数，golang特性，每个包初始化的时候会自动执行init函数，这里用来初始化gorm。
func init() {

	var err error
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", utils.ServerConf.MysqlDB.User, utils.ServerConf.MysqlDB.Password, utils.ServerConf.MysqlDB.Address, utils.ServerConf.MysqlDB.Port, utils.ServerConf.MysqlDB.DatabaseName)
	//fmt.Println(dsn)
	_mdb, err = gorm.Open(mysql.New(mysql.Config{
		DSN:                       dsn,
		DefaultStringSize:         256,  // string 类型字段的默认长度
		DisableDatetimePrecision:  true, // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true, // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true, // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: true, // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{
		PrepareStmt: true, //
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   "tas_",                            // 表名前缀，`User`表为`t_users`
			SingularTable: true,                              // 使用单数表名，启用该选项后，`User` 表将是`user`
			NameReplacer:  strings.NewReplacer("CID", "Cid"), // 在转为数据库名称之前，使用NameReplacer更改结构/字段名称。

		},
		NowFunc: func() time.Time {
			return time.Now().In(utils.LocationZone).Local()
		},
		Logger: logger.Default.LogMode(logger.Info),
	})
	if err != nil {
		glog.Fatalf("client error is %v", err)
	} else {
		sqlDB, err := _mdb.DB()

		if err != nil {
			glog.Fatalf("error is %v", err)
		}
		// fmt.Println("PostgresqlDB", sqlDB)

		// SetMaxIdleCons 设置空闲连接池中连接的最大数量
		sqlDB.SetMaxIdleConns(20)

		// SetMaxOpenCons 设置打开数据库连接的最大数量。
		//sqlDB.SetMaxOpenConns(100)

		// SetConnMaxLifetime 设置了连接可复用的最大时间。
		sqlDB.SetConnMaxLifetime(time.Minute * 30)
	}

}

//获取gorm db对象，其他包需要执行数据库查询的时候，只要通过tools.getDB()获取db对象即可。
//不用担心协程并发使用同样的db对象会共用同一个连接，db对象在调用他的方法的时候会从数据库连接池中获取新的连接

func GetDB() *gorm.DB {
	return _mdb
}
